#ifndef __VOLED_API_H__
#define __VOLED_API_H__
#include <stdint.h>
#include <stdio.h>

enum bmp_mode{
    BMP_MIX_MODE = 0,   /* 混合模式 */
    BMP_COVER_MODE      /* 覆盖模式 */
};

typedef struct _oled_fun
{
    /***********************************************************************
     *  函数名: oled_draw_point
     *  描述：在缓冲区打印一个像素
     *  参数：uint8_t x 横坐标
     *  参数：uint8_t y 纵坐标(1-64)
     *  参数：uint8_t mode 显示模式(1:黑底白字 0：白底黑字)
     *  返回值： void
     ***********************************************************************/
    void (*draw_point)(uint8_t x, uint8_t y, uint8_t t);
    /***********************************************************************
     *  函数名: oled_draw_line
     *  描述：画一条直线
     *  参数：uint8_t x1、y1: （x1,y1)点1
     *  参数：uint8_t x2、y2: (x2,y2)点2
     *  参数：uint8_t mode 显示模式(1:黑底白字 0：白底黑字)
     *  返回值： void
     ***********************************************************************/
    void (*draw_line)(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t mode);
    /***********************************************************************
     *  函数名: oled_draw_rect
     *  描述：画一条矩形
     *  参数：uint8_t x1、y1: （x1,y1)点1
     *  参数：uint8_t x2、y2: (x2,y2)点2
     *  参数：uint8_t mode 显示模式(1:黑底白字 0：白底黑字)
     *  返回值： void
     ***********************************************************************/
    void (*draw_rect)(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t mode);
    /***********************************************************************
     *  函数名: oled_show_char
     *  描述：在缓冲区打印一个字符
     *  参数：uint8_t x 横坐标
     *  参数：uint8_t y 纵坐标(1-64)
     *  参数: uint8_t ch 要打印的字符
     *  参数: uint8_t size 字体大小
     *  参数：uint8_t mode 显示模式(1:黑底白字 0：白底黑字)
     *  返回值： void
     ***********************************************************************/
    void (*show_char)(uint8_t x, uint8_t y, uint8_t ch, uint8_t size, uint8_t mode);
    /***********************************************************************
     *  函数名: oled_show_number
     *  描述：在缓冲区打印数字
     *  参数：uint8_t x 横坐标
     *  参数：uint8_t y 纵坐标(1-64)
     *  参数: uint32_t num 要显示的数字
     *  参数: uint8_t  len 数字的长度 
     *  参数：uint8_t mode 显示模式(1:黑底白字 0：白底黑字)
     *  返回值： void
     ***********************************************************************/
    void (*show_number)(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode);
    /***********************************************************************
     *  函数名: oled_show_string
     *  描述：在缓冲区打印字符串
     *  参数：uint8_t x 横坐标
     *  参数：uint8_t y 纵坐标(1-64)
     *  参数: const uint8_t *p 要显示的字符串指针
     *  参数: size_t size 字体大小 
     *  参数：uint8_t mode 显示模式(1:黑底白字 0：白底黑字)
     *  返回值： void
     ***********************************************************************/
    void (*show_string)(uint8_t x, uint8_t y, const uint8_t *p, size_t size, uint8_t mode);
    /***********************************************************************
     *  函数名: oled_draw_bmp
     *  描述：以page为单位在缓冲区绘画一张bmp图片，速度快，但是不灵活(0-8) 融合的形式
     *  参数：uint8_t x 横坐标
     *  参数：uint8_t y 纵坐标(0-1)
     *  参数: uint8_t w bmp宽度(竖着总量/8)
     *  参数: uint8_t l bmp长度
     *  参数: uint8_t model 模式： 0 混合(融合)模式； 1：替换(覆盖))模式;
     *  参数：void *bmp bmp资源
     ***********************************************************************/
    void (*draw_bmp)(uint8_t x, uint8_t y, uint8_t w, uint8_t l, uint8_t model, void *bmp);
    /***********************************************************************
     *  函数名: oled_draw_bmp_point
     *  描述：在像素为单位缓冲区绘画一张bmp图片，速度慢，但是灵活(0-64)
     *  参数：uint8_t x 横坐标
     *  参数：uint8_t y 纵坐标(0-64)
     *  参数: uint8_t w bmp宽度(竖着总量/8)
     *  参数: uint8_t l bmp长度
     *  参数：void *bmp bmp资源
     *  参数：uint8_t mode 是否反色（1：白底黑图 0：黑底白图Y）
     ***********************************************************************/
    void (*draw_bmp_point)(uint8_t x, uint8_t y, uint8_t w, uint8_t l, uint8_t mode, void *bmp);
    /***********************************************************************
     *  函数名: oled_draw_bmp_reversal
     *  描述：在缓冲区 垂直反转 绘画一张bmp图片
     *  参数：uint8_t x 横坐标
     *  参数：uint8_t y 纵坐标
     *  参数: uint8_t w bmp宽度(竖着总量/8)
     *  参数: uint8_t l bmp长度
     *  参数: uint8_t model 模式： 0 混合(融合)模式； 1：替换(覆盖))模式;
     *  参数：void *bmp bmp资源
     ***********************************************************************/
    void (*draw_bmp_reversal)(uint8_t x, uint8_t y, uint8_t w, uint8_t l, uint8_t model, void *bmp);
    /***********************************************************************
     *  函数名: oled_clean_gram
     *  描述：将缓冲区写满某个数值，一般用于清屏!!!
     *  参数：uint8_t data  要填充的值
     *  返回值： void
     ***********************************************************************/
    void (*clean_gram)(uint8_t data);
    /***********************************************************************
     *  函数名: oled_all_refresh_gram
     *  描述：将缓存刷新到屏幕上
     *  参数：uint8_t mode
     *      @ 0: 刷新完保留缓存
     *      @ 1: 刷新完清空缓存
     *  返回值： void
     ***********************************************************************/
    void (*refresh_all)(uint8_t mode);
} Oled_api;
extern Oled_api oled;

#endif
